# -*- coding:utf-8 -*-
import numpy
from sklearn.cluster import KMeans
# from sklearn.cluster import k_means#这个是先写的，他们两的参数就相差一个数据集，不过还是建议用KMeans
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

def load_Data(filePath):
    dataMap = []
    file = open(filePath, 'r')

    for lines in file.readlines():
        row = []
        # curLine = lines.strip().split()#２维数据
        curLine = lines.strip().split('\t')
        for line in curLine:
            x = float(line)
            row.append(x)

        dataMap.append(row)
    file.close()
    return np.asarray(dataMap)


if __name__ == '__main__':
    # filePath = '../data/training_4k2_far.txt'
    # filePath = '../data/iris.txt'
    filePath = './kmeansData.txt'
    dataMap = load_Data(filePath)

    # print dataMap
    '''直接调用sklearn中的数据'''
    # dataMap = load_iris().data
    estimator = KMeans(n_clusters=4, max_iter=300, n_init=10).fit(dataMap)  # 构造聚类器
    '''这个是必须写的，相当于上面构造出来，配置好，下面这句调用，当然也可以写到上面去
    fit方法对数据做training 并得到模型'''
    # estimator.fit(dataMap)#聚类
    # 下面是三个属性
    '''把聚类的样本打标签'''
    labelPred = estimator.labels_
    '''显示聚类的质心'''
    centroids = estimator.cluster_centers_
    '''这个也可以看成损失，就是样本距其最近样本的平方总和'''
    inertia = estimator.inertia_
    print(labelPred)
    print(centroids)
    print(inertia)
    # 这下面是库里包装的方法
    '''返回预测的样本属于的类的聚类中心'''
    print(estimator.fit_predict(dataMap))
    print(estimator.predict(dataMap))
    '''这个是返回每个样本与聚类质心的距离'''
    print(estimator.fit_transform(dataMap))
    print(estimator.transform(dataMap))
    '''这个我觉得和损失一样，评价聚类好坏'''
    print(estimator.score(dataMap))
    result = estimator.predict(dataMap)
    # 用不同的颜色绘制数据点
    mark = ['or', 'og', 'ob', 'ok']
    for i, d in enumerate(dataMap):
        plt.plot(d[0], d[1], mark[result[i]])
    # 画出各个分类的中心点
    mark = ['*r', '*g', '*b', '*k']
    for i, center in enumerate(centroids):
        plt.plot(center[0], center[1], mark[i], markersize=20)

    # 绘制簇的作用域
    # 获取数据值所在的范围
    x_min, x_max = dataMap[:, 0].min() - 1, dataMap[:, 0].max() + 1
    y_min, y_max = dataMap[:, 1].min() - 1, dataMap[:, 1].max() + 1

    # 生成网格矩阵
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))
    z = estimator.predict(np.c_[xx.ravel(), yy.ravel()])
    z = z.reshape(xx.shape)
    cs = plt.contourf(xx, yy, z)
    plt.show()
